<?php
class App {//类定义开始

    static public function init() 
    {
        // 设定错误和异常处理
        set_error_handler(array('App','appError'));
        set_exception_handler(array('App','appException'));
        
        //[RUNTIME]
        // 检查项目是否编译过
        // 在部署模式下会自动在第一次执行的时候编译项目
        if (defined('RUNTIME_MODEL')) {
            // 运行模式无需载入项目编译缓存
        } else if (is_file(RUNTIME_PATH.'/~app.php') && (!is_file(CONFIG_PATH.'config.php') || filemtime(RUNTIME_PATH.'/~app.php')>filemtime(CONFIG_PATH.'config.php'))) {
            // 直接读取编译后的项目文件
            C(include RUNTIME_PATH.'/~app.php');
        } else {
            // 预编译项目
            App::build();
        }
        //[/RUNTIME]

        if (!defined('MODULE_NAME'))
            define('MODULE_NAME', App::getModule()); // Module名称
        if (!defined('ACTION_NAME'))
            define('ACTION_NAME', App::getAction()); // Action操作
        //echo  APP_NAME;
        //echo  MODULE_NAME;
        //echo  ACTION_NAME;exit();   
        // If already slashed, strip.
        if (get_magic_quotes_gpc()) {
            $_GET    = stripslashes_deep( $_GET    );
            $_POST   = stripslashes_deep( $_POST   );
            $_COOKIE = stripslashes_deep( $_COOKIE );
        }
        
        // 初始化运行时缓存
        object_cache_init();
        
        // 修正IIS下的$_SERVER['REQUEST_URI']
        if ($_SERVER['REQUEST_URI'])
            $_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'] . ($_SERVER['QUERY_STRING'] ? ('?' . $_SERVER['QUERY_STRING']) : '');

        // 站点设置
        App::checkSiteOption();

        // 项目开始标签
        if (C('APP_PLUGIN_ON'))
            tag('app_begin');

        // 设置系统时区 PHP5支持
        if (function_exists('date_default_timezone_set'))
            date_default_timezone_set(C('DEFAULT_TIMEZONE'));

        // 允许注册AUTOLOAD方法
        if (C('APP_AUTOLOAD_REG') && function_exists('spl_autoload_register'))
            spl_autoload_register(array('Think', 'autoload'));

        // 重塑Session (必须位于session_start()之前)
        if (isset($_POST['PHPSESSID'])) {
            session_destroy();
            session_id($_POST['PHPSESSID']);
        }
        
        // 初始化Session
        if (C('SESSION_AUTO_START'))
            session_start();

        /* 
         * 应用调度过滤器
         * 如果没有加载任何URL调度器, 默认只支持 QUERY_STRING 方式
         */
        if (C('URL_DISPATCH_ON'))
            Dispatcher::dispatch();

        /*
         * PHP_FILE 由内置的Dispacher定义
         * 如果不使用该插件，需要重新定义
         */
        if (!defined('PHP_FILE'))
            define('PHP_FILE',_PHP_FILE_);

        // 取得模块和操作名称
        // 可以在Dispatcher中定义获取规则
        
        // 404页面
        C('ERROR_PAGE', U('home/Public/error404'));
        
        // 使用手持设备时, 对home的访问默认跳转至WAP版, 除非用户指定访问普通版.
        if (APP_NAME == 'home' && isMobile() && $_SESSION['wap_to_normal'] != '1' && cookie('wap_to_normal') != '1')
            U('wap/Index/index', '', true);
        
        // 检查应用是否安装 (Admin和默认应用不需要安装)
        if (MODULE_NAME != 'Admin' && !in_array(APP_NAME, C('DEFAULT_APPS')) && !model('App')->isAppNameActive(APP_NAME))
            throw_exception(L('_APP_INACTIVE_').APP_NAME);

        global $ts;
        $ts['_app']    = APP_NAME;
        $ts['_mod']    = MODULE_NAME;
        $ts['_act']    = ACTION_NAME;
        
        // 加载模块配置文件
        if (is_file(CONFIG_PATH.strtolower(MODULE_NAME).'_config.php'))
            C(include CONFIG_PATH.strtolower(MODULE_NAME).'_config.php');

        // 用户认证
        App::checkUser();
        // 语言检查
        App::checkLanguage();
        // 模板检查
        App::checkTemplate();
        // 开启静态缓存
        if (C('HTML_CACHE_ON'))
            HtmlCache::readHTMLCache();

        // 项目初始化标签
        if (C('APP_PLUGIN_ON'))
            tag('app_init');
            
        return ;
    }
}